#include "../common/Argv.h"
#include "../common/StringUtils.h"
#include "../logger/logger.h"
#include "../channel_common/ChannelCommon.h"
#include "../channel_common/BrokerQueue.h"
#include "../IPC/ClientSocket.h"
#include "../IPC/Sequence.h"
#include "../middleware/CommunicationVendedor.h"
#include "../channel_common/routing_tables/RoutingService.h"

int main(int argc, char **argv)
{
	char buffer[TAM_BUFFER];

	//Toma argumentos (main)
	Argv args(argv);

	if (args.getArgc() != 3)
	{
		std::cout <<" Canal Entrada Broker Error: Cantidad de parametros invalida."<<std::endl;
		exit(1);
	}

	//init
	ipc::ClientSocket socketEntrada(args.getArgAsInt(1));
	std::string brokerName = args.getArg(2);
	channel::BrokerQueue queue(brokerName);

	CLogger::create("CE broker:"+brokerName);

	//Run
	channel::ChannelMessage message;
	bool deboSeguir = true;
	int mTypeDestino;

	CLogger::log("Iniciado",LogLevelEnum::INFO);

	while (deboSeguir)
	{
		socketEntrada.receive(buffer, TAM_BUFFER);
		memcpy(&message, buffer,sizeof(message));

		
		CLogger::log("Se obtuvo msg de la red con destino:" +
				StringUtils::NumberToString(message.destino),LogLevelEnum::DEBUG);

		//TODO ver que hago con el resto de los tipos
		if (message.tipo == channel::CHANNEL_END_MSG)
		{
			char hostName[TAM_PDU_CANAL];

			deboSeguir = false;

			strcpy(hostName,message.payload);

			CLogger::log("Se va a terminar el canal de comunicacion al host: "
							+std::string(hostName),LogLevelEnum::DEBUG);

			mTypeDestino = channel::RoutingService::getHostIdbyHost(brokerName,hostName);

			std::cout << "Obtenido host id:"<< mTypeDestino<<std::endl;

			//Si me devuelve id 0 es un error
			if(mTypeDestino == 0)
			{
				CLogger::log("Se obtuvo mType 0 de la tabla de routeo en el cierre (canal half-duplex?)"+
							StringUtils::NumberToString(message.destino),LogLevelEnum::WARN);
				continue;
			}
		}
		else
		{
			//Si me devuelve id 0 es un error
			if(message.destino == 0)
			{
				CLogger::log("ERROR!! Vino destino 0 en el mensaje",LogLevelEnum::ERROR);
				continue;
			}

			//Pido al servicio de resolucion el mtype para sacar el
			mTypeDestino = channel::RoutingService::getHostIdbyAgent(brokerName,
						   StringUtils::NumberToString(message.destino));

			CLogger::log("El agente:" +StringUtils::NumberToString(message.destino)+
					" sale del broker con el id:"+
					StringUtils::NumberToString(mTypeDestino),LogLevelEnum::DEBUG);

			//Si me devuelve id 0 es un error
			if(mTypeDestino == 0)
			{
				CLogger::log("ERROR!! Se obtuvo mType 0 de la tabla de routeo para el destino"+
							StringUtils::NumberToString(message.destino),LogLevelEnum::ERROR);
				continue;
			}
		}

		queue.sendToTransmiter(mTypeDestino, message);
	}

	socketEntrada.close();
	CLogger::log("Canal Entrada Broker.",LogLevelEnum::INFO);

	return 0;
}
